/**
 * 
 */
package datensaetze;

import java.util.Map;

import exceptions.NoPreferredNameException;

public abstract class Analysator {

	protected Analysator() {
	};

	/*
	 * Wird benötigt: - zum eindeutigen Zugriff auf die - zur Sortierung der
	 * Felder - wenn die Tags in einem anderen Format (z.B. Pica+) vorliegen
	 */
	protected String mainTag = null;

	public String getMainTag() {
		return mainTag;
	}

	/**
	 * Analysiert eine eingelesene Zeile.
	 * 
	 * @param feld
	 * @param tag
	 * @param info
	 * @return		true = Gelingen, false = Nichtgelingen.
	 * 				Bei Nichtgelingen wird das Feld von der aufrufenden 
	 * 				Funktion gelöscht.
	 * @throws NoPreferredNameException		Wenn ein fataler Fehler auftrat, der
	 * in der Regel nicht behandelt werden kann, da ein eindeutiger
	 * Name nicht mehr festgestellt werden kann.
	 */
	public abstract boolean analyzeTag(Feld feld, String tag, String info)
			throws NoPreferredNameException;

	/**
	 *  Trägt ein Exemplar der Klasse bei einer Hashmap ein 
	 *  	(z.B. "808 --> Felder808).
	 *  Die Funktion kann überschrieben werden, wenn mehrere Tags zu einem
	 *  Analysator gehören. Daher sollte man die Analysatoren nie von Hand in
	 *  die Map eintragen.
	 * @param actions
	 */
	public void anmelden(Map<String, Analysator> actions) {
		actions.put(this.mainTag, this);
	}

	/**
	 * Muss in der Unterklasse mit dem Rückgabewert der Unterklasse von
	 * Feld implementiert werden.
	 * z.B:
	 * 		
	 *		public Feld800 getNeuesFeld() {
	 *			return new Feld800();
	 *		}
	 * @return	Eine Unterklasse von Feld.
	 */
	public abstract Feld getNeuesFeld();

	/**
	 * Muss in der Unterklasse noch überschrieben werden.
	 * 
	 * Gibt das diesem Analysator anvertraute und bekannte Feld des
	 * Datensatzes. Diese Methode kann nicht statisch sein, da in den
	 * Unterklassen von Analysator auch die Unterklassen von Feld 
	 * verwendet werden.
	 * 
	 * @param ds
	 * @return Gültiges Feld oder null.
	 */
	public Feld getFeld(Datensatz ds) {
		if (ds == null)
			throw new IllegalArgumentException(
					"übergebener Datensatz == null");
		Feld f = ds.getFeld(mainTag);
		return f;
	}

}